/**
* http 工具类
* 1. 封装了http请求的发送
* 2, 封装了https请求的发送
**/
#include <util.h>
/*
* 回调函数，用于处理接收到的数据
* @param contents 接收到的数据
* @param size 每个数据块的大小
* @param nmemb 数据块的数量
* @param output 输出字符串
* @return 实际写入的字节数
*/
size_t WriteCallback(void* contents, size_t size, size_t nmemb,string* output) {
    size_t total_size = size * nmemb;
    output->append((char*)contents, total_size);
    return total_size;
}
/**
* 发送POST请求
* @param url 请求的URL
* @param data 发送的数据
* @param output 输出字符串
* @return 0 成功 -1 失败
*/
int post(const char* url,string data,string* output) {
    CURL* curl;
    CURLcode res;
    // 初始化libcurl
    curl_global_init(CURL_GLOBAL_DEFAULT);
    // 创建一个CURL对象
    curl = curl_easy_init();
    if(!curl)return -1;
    // 设置URL
    curl_easy_setopt(curl, CURLOPT_URL,url);
    // 设置POST请求
    curl_easy_setopt(curl, CURLOPT_POST, 1L);
    // 设置POST数据
    const char* postData = data.c_str();
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);
    // 设置回调函数，用于处理接收到的数据
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    // 设置回调函数的参数，用于存储接收到的数据
    curl_easy_setopt(curl, CURLOPT_WRITEDATA,output);
    // 执行请求
    res = curl_easy_perform(curl);
    int ok=0;
    // 检查请求是否成功
    if(res != CURLE_OK){
       cerr << "请求失败 " << curl_easy_strerror(res) << endl;
       ok=-1;
    }
    // 清理CURL对象
    curl_easy_cleanup(curl);
    // 清理libcurl
    curl_global_cleanup();
    return ok;
}
/**
* 域名解析
* @param id 登录ID
* @param token 登录token
* @param domain 域名
* @param sub_domain 子域名
* @param type 类型
* @param value 值
* @return 0 成功 -1 失败
*/
int dnspod(string id,string token,string domain,string sub_domain,string type,string value){
    // 定义API URL 获取记录列表
    const char* api_list_url="https://dnsapi.cn/Record.List";
    // 定义API URL 创建记录
    const char* api_create_url="https://dnsapi.cn/Record.Create";
    // 定义API URL 修改记录
    const char* api_modify_url="https://dnsapi.cn/Record.Modify";
    string output;
    string data="login_token="+id+","+token;
    data+="&format=json";
    data+="&domain="+domain;
    data+="&sub_domain="+sub_domain;
    // 发送POST请求获取记录列表 失败返回-1
    if(post(api_list_url,data,&output)==-1)return -1;
    // 解析JSON响应
    json j = json::parse(output);
        json records = j["records"];
        json status=nullptr;
        if (records.empty()) {
        // 没有记录，发送POST请求创建记录
        data="login_token="+id+","+token;
        data+="&format=json";
        data+="&domain="+domain;
        data+="&sub_domain="+sub_domain;
        data+="&record_type="+type;
        data+="&record_line=默认";
        data+="&value="+value;
        output="";// 清空字符串
        // 发送POST请求创建记录 失败返回-1
        if(post(api_create_url,data,&output)==-1)return -1;

        // 解析JSON响应
        j = json::parse(output);
        status=j["status"];
        // 访问JSON对象的属性
        string code = status.at("code");
        // 检查状态码是否为"1"
        if (strcmp(code.c_str(),"1") == 0){
            cout << "创建记录成功" << endl;
            return 0;
        }else{
            cout << "创建记录失败" << endl;
            return -1;
        }

        }else{
            // 有记录，发送POST请求修改记录
            json record = records[0];
            string record_id = record["id"];
            data="login_token="+id+","+token;
            data+="&format=json";
            data+="&domain="+domain;
            data+="&sub_domain="+sub_domain;
            data+="&record_id="+record_id;
            data+="&record_type="+type;
            data+="&record_line=默认";
            data+="&value="+value;
            output="";// 清空字符串
            if(post(api_modify_url,data,&output)==-1)return -1;
            // 解析JSON响应
            j = json::parse(output);
            status=j["status"];
            // 访问JSON对象的属性
            string code = status.at("code");
            if (strcmp(code.c_str(),"1") == 0){
                cout << "修改记录成功" << endl;
                return 0;
            }else{
                cout << "修改记录失败" << endl;
                return -1;
            }
        }

    return 0;
}



